#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/time.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/stat.h>
#include<cstdio>
#include<cstring>
#include<fcntl.h>
#include<signal.h>
#include<pthread.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<vector>
#include<arpa/inet.h>
#include<sys/wait.h>
#include<functional>
#include <semaphore.h>
#include<jsoncpp/json/json.h>
#include<sys/select.h>
#include"Log.hpp"
using namespace std;

class Until
{
public:
    static int ReadLine(int sock,string& out) 
    {
        char ch='X';
        while(ch!='\n')
        {
            int n=recv(sock,ch,1,0);
            if(n>0)
            {
                if(ch=='\r')
                {
                 recv(sock,ch,1,MSG_PEEK);
                 if(ch=='\n')
                 {
                    recv(sock,ch,1,0);
                 }
                 else
                 {
                    ch='\n';
                 }
                }
               out.push_back(ch);
            }
            else if(n==0)
            {
                return 0;
            }
            else
            return -1;
        }
        return out.size();
    }
    static bool CutString(const string&target,string& key_out,string& value_out,string sep)
    {
        if(target.find(sep)!=string::npos)
        {
            key_out=target.substr(0,sep);
            value_out=target.substr(sep+sep.size());
            return true;
        }
        return false;
    }   
};